package com.zzyl.common.utils.pdf;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;

/**
 * PDF内容提取工具类 - 基于PDFBox实现
 */
public class PdfContentExtractor {
    
    /**
     * 从PDF文件中提取文本内容
     * 
     * @param filePath PDF文件路径
     * @return 提取的文本内容
     * @throws IOException 文件读取异常
     */
    public static String extractTextFromFile(String filePath) throws IOException {
        try (PDDocument document = PDDocument.load(new File(filePath))) {
            PDFTextStripper stripper = new PDFTextStripper();
            return stripper.getText(document);
        }
    }
    
    /**
     * 从PDF文件中提取指定页码范围的文本内容
     * 
     * @param filePath PDF文件路径
     * @param startPage 起始页码（从1开始）
     * @param endPage 结束页码
     * @return 提取的文本内容
     * @throws IOException 文件读取异常
     */
    public static String extractTextFromFile(String filePath, int startPage, int endPage) throws IOException {
        try (PDDocument document = PDDocument.load(new File(filePath))) {
            PDFTextStripper stripper = new PDFTextStripper();
            stripper.setStartPage(startPage);
            stripper.setEndPage(endPage);
            return stripper.getText(document);
        }
    }
    
    /**
     * 从PDF输入流中提取文本内容
     * 
     * @param inputStream PDF文件输入流
     * @return 提取的文本内容
     * @throws IOException 流读取异常
     */
    public static String extractTextFromStream(InputStream inputStream) throws IOException {
        try (PDDocument document = PDDocument.load(inputStream)) {
            PDFTextStripper stripper = new PDFTextStripper();
            return stripper.getText(document);
        }
    }
    
    /**
     * 从PDF输入流中提取指定页码范围的文本内容
     * 
     * @param inputStream PDF文件输入流
     * @param startPage 起始页码（从1开始）
     * @param endPage 结束页码
     * @return 提取的文本内容
     * @throws IOException 流读取异常
     */
    public static String extractTextFromStream(InputStream inputStream, int startPage, int endPage) throws IOException {
        try (PDDocument document = PDDocument.load(inputStream)) {
            PDFTextStripper stripper = new PDFTextStripper();
            stripper.setStartPage(startPage);
            stripper.setEndPage(endPage);
            return stripper.getText(document);
        }
    }
    
    /**
     * 获取PDF文件的页数
     * 
     * @param filePath PDF文件路径
     * @return PDF页数
     * @throws IOException 文件读取异常
     */
    public static int getPDFPageCount(String filePath) throws IOException {
        try (PDDocument document = PDDocument.load(new File(filePath))) {
            return document.getNumberOfPages();
        }
    }
    
    /**
     * 获取PDF文件的页数（从输入流）
     * 
     * @param inputStream PDF文件输入流
     * @return PDF页数
     * @throws IOException 流读取异常
     */
    public static int getPDFPageCount(InputStream inputStream) throws IOException {
        try (PDDocument document = PDDocument.load(inputStream)) {
            return document.getNumberOfPages();
        }
    }
    
    /**
     * 提取PDF文件内容（带异常处理的便捷方法）
     * 
     * @param filePath PDF文件路径
     * @return 提取的文本内容，如果出错返回null
     */
    public static String extractTextSafely(String filePath) {
        try {
            return extractTextFromFile(filePath);
        } catch (IOException e) {
            System.err.println("提取PDF内容失败: " + e.getMessage());
            return null;
        }
    }
    
    // 使用示例
    public static void main(String[] args) {
        String pdfFilePath = "example.pdf"; // 替换为实际的PDF文件路径
        
        try {
            // 提取整个PDF的文本内容
            String content = extractTextFromFile(pdfFilePath);
            System.out.println("PDF内容:");
            System.out.println(content);
            
            // 提取前3页的文本内容
            String partialContent = extractTextFromFile(pdfFilePath, 1, 3);
            System.out.println("\n前3页内容:");
            System.out.println(partialContent);
            
            // 获取PDF页数
            int pageCount = getPDFPageCount(pdfFilePath);
            System.out.println("\nPDF总页数: " + pageCount);
            
        } catch (IOException e) {
            System.err.println("处理PDF文件时出错: " + e.getMessage());
            e.printStackTrace();
        }
    }
}
